Apache CXF এন্ডপয়েন্ট (Endpoints) এবং ইন্টারসেপ্টরস (Interceptors) ওয়েব সার্ভিস ডেভেলপমেন্টে অত্যন্ত গুরুত্বপূর্ণ উপাদান। এন্ডপয়েন্ট হল সেই স্থান যেখানে ওয়েব সার্ভিস রিকোয়েস্ট রিসিভ করে এবং প্রক্রিয়া করে, আর ইন্টারসেপ্টরস ওয়েব সার্ভিসের প্রক্রিয়ার মধ্যে নির্দিষ্ট অংশে কাস্টম লজিক প্রয়োগ করার সুযোগ দেয়। এই দুটি উপাদান ওয়েব সার্ভিসের কার্যকারিতা, নিরাপত্তা এবং অন্যান্য কাজের নিয়ন্ত্রণে সাহায্য করে।
এন্ডপয়েন্ট (Endpoint) হল সেই স্থান যেখানে ওয়েব সার্ভিসের অপারেশনগুলি অ্যাক্সেস করা যায়। Apache CXF এ, এন্ডপয়েন্ট হল একটি Java অবজেক্ট যা ওয়েব সার্ভিসের কার্যকরী অপারেশন বাস্তবায়ন করে এবং ক্লায়েন্টদের প্রোগ্রাম্যাটিক্যালি এক্সিকিউট করার সুযোগ দেয়।
CXF ওয়েব সার্ভিসে এন্ডপয়েন্ট হল সেই স্থান, যেখানে ওয়েব সার্ভিসের অপারেশন সংজ্ঞায়িত করা হয় এবং এই অপারেশনগুলো SOAP বা REST API-এর মাধ্যমে অ্যাক্সেস করা যায়। একে সহজভাবে বললে, এটি ওয়েব সার্ভিসের service URL হিসাবে কাজ করে। Endpoints HTTP, SOAP, বা RESTful প্রোটোকল ব্যবহার করতে পারে।
Apache CXF তে ওয়েব সার্ভিসের এন্ডপয়েন্ট তৈরি করতে নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করা হয়:
Service ইন্টারফেস তৈরি: প্রথমে একটি জাভা ইন্টারফেস তৈরি করা হয় যা ওয়েব সার্ভিসের অপারেশন ডিফাইন করে।
@WebService
public interface HelloWorld {
String sayHello(String name);
}
Service ইমপ্লিমেন্টেশন তৈরি: এরপর এই ইন্টারফেসটি ইমপ্লিমেন্ট করতে একটি ক্লাস তৈরি করা হয় যা ওয়েব সার্ভিসের অপারেশন বাস্তবায়ন করে।
@WebService(endpointInterface = "com.example.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHello(String name) {
return "Hello, " + name;
}
}
Endpoint কনফিগারেশন: এরপর CXF এন্ডপয়েন্টের জন্য কনফিগারেশন করা হয়।
import org.apache.cxf.jaxws.EndpointImpl;
public class Server {
public static void main(String[] args) {
// Create the service implementation
HelloWorldImpl implementor = new HelloWorldImpl();
// Create the endpoint and bind it to a URL
EndpointImpl endpoint = new EndpointImpl(implementor);
endpoint.publish("http://localhost:8080/helloWorld");
}
}
এখানে:
EndpointImpl
: এটি Apache CXF এর ক্লাস যা ওয়েব সার্ভিসের এন্ডপয়েন্ট তৈরি করে।publish()
: এটি সার্ভিসটি নির্দিষ্ট URL-এ প্রকাশ করতে ব্যবহৃত হয়।Apache CXF একাধিক প্রোটোকল সাপোর্ট করে (SOAP, REST) এবং আপনি চাইলে SOAP বা RESTful ওয়েব সার্ভিসের জন্য আলাদা এন্ডপয়েন্ট কনফিগার করতে পারেন। SOAP প্রোটোকল ব্যবহার করার জন্য JAX-WS
এর কনফিগারেশন করা হয়, এবং REST প্রোটোকল ব্যবহারের জন্য JAX-RS
কনফিগারেশন প্রয়োজন।
ইন্টারসেপ্টরস (Interceptors) হল Apache CXF-এর গুরুত্বপূর্ণ উপাদান যা ওয়েব সার্ভিসের প্রক্রিয়ার মধ্যে মডিফিকেশন বা অতিরিক্ত কার্যকলাপ যুক্ত করতে ব্যবহৃত হয়। ইন্টারসেপ্টরস রিকোয়েস্ট এবং রেসপন্সের মধ্যবর্তী সময়ের মধ্যে কাজ করে, এবং এই সময়ের মধ্যে আপনি লজিক বা কাস্টম প্রক্রিয়া যোগ করতে পারেন, যেমন লগিং, সিকিউরিটি, বা অন্যান্য কাস্টম কাজ।
CXF ইন্টারসেপ্টরস প্রাথমিকভাবে তিনটি ধাপে কাজ করতে পারে:
ইন্টারসেপ্টর কনফিগার করতে, আপনাকে CXF-এর inbound
এবং outbound
ফেজে ইন্টারসেপ্টর যুক্ত করতে হবে। উদাহরণস্বরূপ, আপনি একটি লগিং ইন্টারসেপ্টর তৈরি করতে পারেন যা রিকোয়েস্ট এবং রেসপন্সের ডেটা লগ করবে।
import org.apache.cxf.interceptor.AbstractPhaseInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
public class LoggingInInterceptor extends AbstractPhaseInterceptor<Message> {
public LoggingInInterceptor() {
super(Phase.RECEIVE);
}
@Override
public void handleMessage(Message message) throws Fault {
System.out.println("Inbound message: " + message);
}
}
import org.apache.cxf.interceptor.AbstractPhaseInterceptor;
import org.apache.cxf.message.Message;
import org.apache.cxf.interceptor.Fault;
public class LoggingOutInterceptor extends AbstractPhaseInterceptor<Message> {
public LoggingOutInterceptor() {
super(Phase.SEND);
}
@Override
public void handleMessage(Message message) throws Fault {
System.out.println("Outbound message: " + message);
}
}
CXF এ ইন্টারসেপ্টর কনফিগার করতে, cxf-servlet.xml
বা কোডের মাধ্যমে ইন্টারসেপ্টরগুলো প্রকাশ করা হয়:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:cxf="http://cxf.apache.org/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">
<!-- Register the inbound and outbound interceptors -->
<bean id="loggingInInterceptor" class="com.example.LoggingInInterceptor"/>
<bean id="loggingOutInterceptor" class="com.example.LoggingOutInterceptor"/>
<cxf:bus>
<cxf:inInterceptors>
<ref bean="loggingInInterceptor"/>
</cxf:inInterceptors>
<cxf:outInterceptors>
<ref bean="loggingOutInterceptor"/>
</cxf:outInterceptors>
</cxf:bus>
</beans>
এখানে, inInterceptors
এবং outInterceptors
প্রোপার্টি দ্বারা ইনবাউন্ড এবং আউটবাউন্ড ইন্টারসেপ্টরগুলো সংযুক্ত করা হয়।
Apache CXF তে এন্ডপয়েন্ট এবং ইন্টারসেপ্টরস ওয়েব সার্ভিসের কার্যকারিতা এবং নিরাপত্তা নিয়ন্ত্রণে গুরুত্বপূর্ণ ভূমিকা পালন করে। এন্ডপয়েন্ট সার্ভিসের বিভিন্ন অপারেশন ক্লায়েন্টদের জন্য উপলব্ধ করায়, এবং ইন্টারসেপ্টরস রিকোয়েস্ট এবং রেসপন্সের প্রক্রিয়ায় কাস্টম লজিক প্রয়োগ করতে সহায়তা করে। এগুলোর সঠিক ব্যবহার ওয়েব সার্ভিসের কার্যক্ষমতা, সিকিউরিটি, এবং এক্সটেনসিবিলিটি বৃদ্ধি করতে সাহায্য করে।
ওয়েব সার্ভিস এন্ডপয়েন্ট (Endpoints) হলো সেই স্থান যেখানে সার্ভিসের অপারেশনগুলি ক্লায়েন্ট থেকে এক্সিকিউট করা যায়। Apache CXF ব্যবহার করে ওয়েব সার্ভিসে এন্ডপয়েন্ট তৈরি এবং ব্যবহার করা একটি সাধারণ প্রক্রিয়া যা SOAP বা RESTful সার্ভিসের মাধ্যমে কার্যকরী হয়। এখানে আমরা SOAP ওয়েব সার্ভিসের এন্ডপয়েন্ট তৈরি করার প্রক্রিয়া বিস্তারিতভাবে দেখব, যা একইভাবে RESTful ওয়েব সার্ভিসেও প্রয়োগ করা যেতে পারে।
Apache CXF এ SOAP ওয়েব সার্ভিসের জন্য এন্ডপয়েন্ট তৈরি করার জন্য মূলত তিনটি ধাপ অনুসরণ করা হয়:
প্রথমে আপনাকে একটি Java ইন্টারফেস তৈরি করতে হবে যা ওয়েব সার্ভিসের অপারেশনগুলো ডিফাইন করবে। ইন্টারফেসে @WebService
অ্যানোটেশন ব্যবহার করে ওয়েব সার্ভিসের মেথডগুলো ডিফাইন করা হয়।
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
@WebMethod
String sayHello(String name);
}
এরপর আপনাকে ওয়েব সার্ভিসের কার্যকরী বাস্তবায়ন তৈরি করতে হবে। এই ক্লাসটি ইন্টারফেসের মেথডগুলির বাস্তবায়ন করবে।
import javax.jws.WebService;
@WebService(endpointInterface = "com.example.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHello(String name) {
return "Hello, " + name;
}
}
এখন, Apache CXF এর মাধ্যমে এই সার্ভিসটি একটি URL-এ প্রকাশ করতে হবে, যাতে ক্লায়েন্ট এই সার্ভিসে অ্যাক্সেস করতে পারে।
import org.apache.cxf.jaxws.EndpointImpl;
public class Server {
public static void main(String[] args) {
// Create service implementation
HelloWorldImpl implementor = new HelloWorldImpl();
// Create endpoint and publish it
EndpointImpl endpoint = new EndpointImpl(implementor);
endpoint.publish("http://localhost:8080/helloWorld");
}
}
এখানে, http://localhost:8080/helloWorld
URL এ ওয়েব সার্ভিসটি প্রকাশিত হবে।
Apache CXF এ RESTful ওয়েব সার্ভিসের জন্য JAX-RS
API ব্যবহার করা হয়। নিম্নলিখিত ধাপগুলির মাধ্যমে RESTful সার্ভিসের এন্ডপয়েন্ট তৈরি করা হয়।
প্রথমে একটি ইন্টারফেস তৈরি করতে হবে যা REST API এর জন্য বিভিন্ন HTTP মেথড ডিফাইন করবে (যেমন GET
, POST
, PUT
, DELETE
)।
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
@Path("/hello")
public interface HelloWorldService {
@GET
String sayHello(@QueryParam("name") String name);
}
এবার ইন্টারফেসটি ইমপ্লিমেন্ট করে সার্ভিসের কার্যকরী বাস্তবায়ন তৈরি করতে হবে।
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
@Path("/hello")
public class HelloWorldServiceImpl implements HelloWorldService {
@Override
public String sayHello(String name) {
return "Hello, " + name;
}
}
এখন, Apache CXF এর মাধ্যমে RESTful সার্ভিসটি প্রকাশ করতে হবে।
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
public class RestServer {
public static void main(String[] args) {
// Create service implementation
HelloWorldServiceImpl implementor = new HelloWorldServiceImpl();
// Create and configure the JAX-RS server
JAXRSServerFactoryBean factoryBean = new JAXRSServerFactoryBean();
factoryBean.setServiceBean(implementor);
factoryBean.setAddress("http://localhost:8080/helloWorld");
// Publish the REST endpoint
factoryBean.create();
}
}
এন্ডপয়েন্ট তৈরি হয়ে গেলে, এখন ক্লায়েন্ট অ্যাপ্লিকেশন থেকে সেই ওয়েব সার্ভিসে রিকোয়েস্ট পাঠানো যেতে পারে। SOAP এবং RESTful উভয় সার্ভিসের জন্য ক্লায়েন্ট তৈরি করা যেতে পারে।
import javax.xml.ws.Service;
import java.net.URL;
public class HelloWorldClient {
public static void main(String[] args) throws Exception {
URL url = new URL("http://localhost:8080/helloWorld?wsdl");
QName qname = new QName("http://example.com", "HelloWorldImplService");
Service service = Service.create(url, qname);
HelloWorld helloWorld = service.getPort(HelloWorld.class);
String response = helloWorld.sayHello("John");
System.out.println(response);
}
}
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.Response;
public class HelloWorldClient {
public static void main(String[] args) {
Client client = ClientBuilder.newClient();
Response response = client.target("http://localhost:8080/helloWorld/hello")
.queryParam("name", "John")
.request()
.get();
String output = response.readEntity(String.class);
System.out.println(output);
}
}
Apache CXF দিয়ে ওয়েব সার্ভিসের এন্ডপয়েন্ট তৈরি করা এবং তা ক্লায়েন্টের মাধ্যমে ব্যবহার করা একটি সহজ এবং কার্যকরী প্রক্রিয়া। SOAP এবং RESTful ওয়েব সার্ভিস উভয়ই Apache CXF দ্বারা সমর্থিত, এবং সার্ভিসের এন্ডপয়েন্টগুলি সহজেই তৈরি এবং কনফিগার করা যায়।
Apache CXF-এ Interceptors ব্যবহার করা হয় ওয়েব সার্ভিসের মধ্যে মেসেজ প্রক্রিয়াকরণের জন্য। এগুলি মূলত SOAP/REST মেসেজগুলো ইনপুট এবং আউটপুট স্ট্রিমে হ্যান্ডলিং এবং ট্রান্সফর্মেশন, লজিকাল প্রসেসিং, এবং নিরাপত্তা ফিচারগুলো অ্যাপ্লাই করার জন্য ব্যবহৃত হয়। Interceptors সার্ভিসের আচরণ কাস্টমাইজ করতে সাহায্য করে, যেমন লগিং, নিরাপত্তা যাচাইকরণ, মেসেজ মডিফিকেশন, কিংবা এক্সসেপশন হ্যান্ডলিং।
Interceptors মেসেজ প্রক্রিয়াকরণে সক্রিয় ভূমিকা পালন করে। এগুলি ইনপুট বা আউটপুট মেসেজগুলোর আগে বা পরে কিছু নির্দিষ্ট কার্যকলাপ সম্পন্ন করতে পারে। উদাহরণস্বরূপ:
Interceptors মেসেজের প্রক্রিয়া কাস্টমাইজ করতে সাহায্য করে, যেমন:
Interceptors কাস্টম ফাংশনালিটি ইন্টিগ্রেট করতে ব্যবহৃত হতে পারে, যেমন:
Apache CXF-এ সাধারণত দুটি ধরনের Interceptors ব্যবহৃত হয়: In-Interceptors এবং Out-Interceptors।
In-Interceptors মেসেজের ইনপুট স্ট্রিমে কার্যকরী হয়, অর্থাৎ যখন ওয়েব সার্ভিসে ইনপুট মেসেজ আসবে, তখন এই ইন্টারসেপ্টর কাজ করবে।
public class LoggingInInterceptor extends AbstractPhaseInterceptor<Message> {
public LoggingInInterceptor() {
super(Phase.RECEIVE);
}
@Override
public void handleMessage(Message message) throws Fault {
System.out.println("Received message: " + message);
}
}
Out-Interceptors মেসেজের আউটপুট স্ট্রিমে কার্যকরী হয়, অর্থাৎ যখন ওয়েব সার্ভিস একটি রেসপন্স বা আউটপুট পাঠায় তখন এই ইন্টারসেপ্টর কাজ করবে।
public class LoggingOutInterceptor extends AbstractPhaseInterceptor<Message> {
public LoggingOutInterceptor() {
super(Phase.PRE_STREAM);
}
@Override
public void handleMessage(Message message) throws Fault {
System.out.println("Sending message: " + message);
}
}
Fault Interceptors ত্রুটি বা এক্সসেপশন হ্যান্ডল করার জন্য ব্যবহৃত হয়। যখন কোনো মেসেজ প্রসেস করার সময় ত্রুটি হয়, তখন এই ইন্টারসেপ্টর এক্সসেপশন বা ফল্ট মেসেজ হ্যান্ডল করে।
public class LoggingFaultInterceptor extends AbstractPhaseInterceptor<Message> {
public LoggingFaultInterceptor() {
super(Phase.POST_PROTOCOL);
}
@Override
public void handleMessage(Message message) throws Fault {
if (message.getContent(Exception.class) != null) {
System.out.println("Fault occurred: " + message.getContent(Exception.class));
}
}
}
CXF Bus-এ ইন্টারসেপ্টর রেজিস্টার করার জন্য cxf.xml
কনফিগারেশন ফাইলে ইন্টারসেপ্টর যুক্ত করা যায়। এখানে ইনপুট এবং আউটপুট ইন্টারসেপ্টর কনফিগার করা হয়েছে:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:cxf="http://cxf.apache.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://cxf.apache.org/schema/beans http://cxf.apache.org/schemas/beans.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<cxf:bus>
<!-- Registering In and Out Interceptors -->
<cxf:inInterceptors>
<ref bean="loggingInInterceptor"/>
</cxf:inInterceptors>
<cxf:outInterceptors>
<ref bean="loggingOutInterceptor"/>
</cxf:outInterceptors>
</cxf:bus>
<bean id="loggingInInterceptor" class="com.example.LoggingInInterceptor"/>
<bean id="loggingOutInterceptor" class="com.example.LoggingOutInterceptor"/>
</beans>
Interceptors সাধারণত বিভিন্ন ওয়েব সার্ভিসের কার্যক্রম যেমন:
Apache CXF-এ Interceptors হলো একটি গুরুত্বপূর্ণ উপাদান যা ওয়েব সার্ভিসের মেসেজ প্রক্রিয়াকরণে ব্যবহৃত হয়। এগুলি বিভিন্ন ধরণের কার্যকারিতা যেমন লগিং, নিরাপত্তা যাচাইকরণ, ডেটা ভ্যালিডেশন, এবং ফল্ট হ্যান্ডলিং এ ব্যবহৃত হয়। ইনপুট এবং আউটপুট ইন্টারসেপ্টর দ্বারা ক্লায়েন্ট এবং সার্ভিসের মধ্যে মেসেজ ট্রান্সফর্মেশন এবং প্রক্রিয়াকরণ করা সম্ভব হয়।
Request এবং Response Interception একটি গুরুত্বপূর্ণ টেকনিক্যাল কৌশল যা RESTful ওয়েব সার্ভিসে ব্যবহৃত হয়। এটি ওয়েব সার্ভিসের ইনপুট (request) এবং আউটপুট (response) প্রক্রিয়াগুলোর মধ্যে কিছু প্রক্রিয়া বা লজিক কার্যকর করতে সাহায্য করে, যেমন লগিং, অথেনটিকেশন, থ্রটলিং, ক্যাশিং, ইত্যাদি।
JAX-RS API এ, Interceptor ব্যবহার করে আপনি HTTP রিকোয়েস্ট এবং রেসপন্সের প্রক্রিয়ায় হুক করতে পারেন। Interceptor ব্যবহার করা হয় আন্ডারলিং HTTP রিকোয়েস্ট এবং রেসপন্সের ওপর এক্সট্রা ফাংশনালিটি প্রয়োগ করার জন্য।
JAX-RS ইন্টারসেপ্টরগুলি মূলত Request Interceptors এবং Response Interceptors হিসেবে বিভক্ত করা হয়।
এখানে Client এবং Server-এর জন্য Request এবং Response Interceptor তৈরি করার পদ্ধতি আলোচনা করা হবে।
নিচে একটি উদাহরণ দেওয়া হলো কিভাবে একটি Server-Side Request Interceptor তৈরি করা যায়। এতে প্রতি রিকোয়েস্টের জন্য কিছু কাস্টম লজিক যেমন লগিং বা ডাটা প্রক্রিয়াকরণ করা হবে।
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
@Provider
public class RequestInterceptor implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
// Log the incoming request
System.out.println("Incoming request: " + requestContext.getUriInfo().getRequestUri());
// You can also manipulate the request here, for example, check for authentication
String authHeader = requestContext.getHeaderString("Authorization");
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
throw new IOException("Unauthorized: Missing or invalid Authorization header");
}
}
}
@Provider
: এটি এই ক্লাসটিকে JAX-RS ফিল্টার হিসেবে চিহ্নিত করে।ContainerRequestFilter
: এটি একটি ইন্টারফেস যা রিকোয়েস্ট ফিল্টার করার জন্য ব্যবহার করা হয়।filter()
মেথডে আপনি রিকোয়েস্টের ইউআরআই বা হেডার পরীক্ষা করতে পারেন এবং প্রয়োজন অনুযায়ী রিকোয়েস্টটি পরিবর্তন করতে পারেন বা ব্যতিক্রম (exception) ছুঁড়ে দিতে পারেন।একটি Server-Side Response Interceptor তৈরি করা হলো, যাতে রেসপন্স ক্লায়েন্টের কাছে পাঠানোর আগে কিছু লজিক প্রয়োগ করা যায়।
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
@Provider
public class ResponseInterceptor implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
// Log the outgoing response status
System.out.println("Outgoing response: " + responseContext.getStatus());
// Modify the response before sending to the client
responseContext.getHeaders().add("X-Custom-Header", "CustomResponseHeader");
}
}
ContainerResponseFilter
: এটি একটি ইন্টারফেস যা রেসপন্স ফিল্টার করার জন্য ব্যবহৃত হয়।filter()
মেথডে আপনি রেসপন্সের স্ট্যাটাস, হেডার বা কন্টেন্ট পরিবর্তন করতে পারেন। এখানে, আমরা রেসপন্সে একটি কাস্টম হেডার যোগ করেছি।এখানে একটি ক্লায়েন্ট সাইড রিকোয়েস্ট ইন্টারসেপ্টরের উদাহরণ দেওয়া হলো:
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
@Provider
public class ClientRequestInterceptor implements ClientRequestFilter {
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
// Log the outgoing client request URI
System.out.println("Client Request URI: " + requestContext.getUri());
// Add custom header
requestContext.getHeaders().add("X-Custom-Request-Header", "CustomValue");
}
}
এখন ক্লায়েন্ট সাইডে রেসপন্স ইন্টারসেপ্টর কিভাবে তৈরি করা যায় তা দেখা যাক:
import javax.ws.rs.client.ClientResponseContext;
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
@Provider
public class ClientResponseInterceptor implements ClientResponseFilter {
@Override
public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
// Log the incoming client response status
System.out.println("Client Response Status: " + responseContext.getStatus());
// Modify the client response if necessary
String responseMessage = responseContext.getEntity(String.class);
System.out.println("Response: " + responseMessage);
}
}
Interceptor ক্লাসগুলোকে JAX-RS Application-এ রেজিস্টার করতে হবে, যাতে সেগুলো কার্যকরী হয়।
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/api")
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new HashSet<>();
resources.add(RequestInterceptor.class);
resources.add(ResponseInterceptor.class);
resources.add(ClientRequestInterceptor.class);
resources.add(ClientResponseInterceptor.class);
return resources;
}
}
এখানে getClasses()
মেথডের মাধ্যমে ইন্টারসেপ্টর ক্লাসগুলো অ্যাপ্লিকেশন কনটেক্সটে রেজিস্টার করা হয়েছে।
Apache CXF এ Interceptors ব্যবহৃত হয় SOAP ও RESTful ওয়েব সার্ভিসের চলাচল প্রক্রিয়া কাস্টমাইজ এবং প্রসেস করার জন্য। Interceptors সাধারণত সার্ভিসের ইনপুট এবং আউটপুট স্ট্রিমকে প্রসেস করতে, লগিং, নিরাপত্তা, ট্রান্সফরমেশন, অডিটিং ইত্যাদি উদ্দেশ্যে ব্যবহৃত হয়।
CXF তে Custom Interceptors তৈরি করে আপনি সার্ভিসের বিভিন্ন স্তরের কার্যক্রমকে নিয়ন্ত্রণ করতে পারবেন, যেমন SOAP মেসেজ প্রক্রিয়াকরণ, লগিং, কিংবা অডিটিং, যা সার্ভিসের আচরণ বা ফ্লো ট্র্যাক করতে সাহায্য করে।
Interceptor হল একটি কাস্টম ক্লাস যা CXF এর মেসেজের লাইফসাইকেল কন্ট্রোল করে, এবং এটি দুই ধরনের হতে পারে:
এছাড়া, Phase এর মাধ্যমে আপনি কনফিগার করতে পারেন কখন এই Interceptors কার্যকর হবে। সাধারণত PRE_PROTOCOL, POST_PROTOCOL, SEND, RECEIVE ইত্যাদি ফেজ ব্যবহার করা হয়।
আপনার প্রয়োজন অনুযায়ী InInterceptor বা OutInterceptor তৈরি করতে পারেন। এখানে একটি কাস্টম OutInterceptor তৈরি করার উদাহরণ দেওয়া হলো যা লগিংয়ের জন্য ব্যবহৃত হবে।
import org.apache.cxf.interceptor.OutInterceptor;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.helpers.XMLUtils;
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.message.MessageContentsList;
import java.util.logging.Logger;
public class LoggingInterceptor extends OutInterceptor {
private static final Logger LOGGER = Logger.getLogger(LoggingInterceptor.class.getName());
public LoggingInterceptor() {
// Set phase to send after protocol phase
super(Phase.POST_PROTOCOL);
}
@Override
public void handleMessage(Message message) {
if (message != null) {
// Get the outgoing message content (response)
MessageContentsList contents = (MessageContentsList) message.getContent(MessageContentsList.class);
String xml = XMLUtils.toString(contents.get(0)); // Convert the response to a string
LOGGER.info("Outgoing message: " + xml); // Log the response message
}
}
}
এখানে:
এছাড়া, আপনি যদি ইনপুট মেসেজ (request) ইন্টারসেপ্ট করতে চান, তাহলে InInterceptor তৈরি করতে পারেন:
import org.apache.cxf.interceptor.InInterceptor;
import org.apache.cxf.message.Message;
import java.util.logging.Logger;
public class RequestLoggingInterceptor extends InInterceptor {
private static final Logger LOGGER = Logger.getLogger(RequestLoggingInterceptor.class.getName());
public RequestLoggingInterceptor() {
// Set phase to receive
super(Phase.RECEIVE);
}
@Override
public void handleMessage(Message message) {
if (message != null) {
String request = message.toString(); // Get the incoming message as string
LOGGER.info("Incoming message: " + request); // Log the incoming message
}
}
}
এখানে:
এখন, আপনাকে Spring বা Java Config ব্যবহার করে এই Custom Interceptors গুলোকে CXF সার্ভিসে কনফিগার করতে হবে।
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Add custom Interceptors -->
<bean id="loggingInterceptor" class="com.example.interceptor.LoggingInterceptor" />
<bean id="requestLoggingInterceptor" class="com.example.interceptor.RequestLoggingInterceptor" />
<!-- CXF Bean Configuration -->
<bean id="cxf" class="org.apache.cxf.bus.spring.SpringBus" />
<!-- Add the Interceptors to the CXF Bus -->
<bean id="server" class="org.apache.cxf.jaxws.EndpointImpl">
<property name="service" ref="helloWorldService"/>
<property name="address" value="/helloWorld"/>
<property name="inInterceptors">
<list>
<ref bean="requestLoggingInterceptor"/>
</list>
</property>
<property name="outInterceptors">
<list>
<ref bean="loggingInterceptor"/>
</list>
</property>
</bean>
</beans>
এখানে:
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.bus.spring.SpringBus;
@Configuration
public class CxfConfig {
@Bean
public LoggingInterceptor loggingInterceptor() {
return new LoggingInterceptor();
}
@Bean
public RequestLoggingInterceptor requestLoggingInterceptor() {
return new RequestLoggingInterceptor();
}
@Bean
public Server cxfServer(SpringBus cxf, HelloWorldService helloWorldService) {
EndpointImpl endpoint = new EndpointImpl(cxf, helloWorldService);
endpoint.getInInterceptors().add(requestLoggingInterceptor());
endpoint.getOutInterceptors().add(loggingInterceptor());
endpoint.publish("/helloWorld");
return endpoint;
}
}
এখানে:
কাস্টম ইন্টারসেপ্টর ব্যবহারের মাধ্যমে আপনি লগিং বা অডিটিং প্রক্রিয়াকে আরও উন্নত করতে পারেন। যেমন:
এই ধরনের কাস্টম ইন্টারসেপ্টরগুলো আপনার অ্যাপ্লিকেশনের API Monitoring, Debugging, এবং Compliance কার্যক্রমকে আরও সহজ ও কার্যকর করতে সাহায্য করে।
এভাবে, আপনি Apache CXF এ Custom Interceptors তৈরি এবং লগিং বা অডিটিংয়ের জন্য ব্যবহার করতে পারেন, যা ওয়েব সার্ভিসের কার্যকারিতা বাড়াতে সহায়ক হবে।
Read more